/**
 * 拦截器类
 * */ 

import { ResolvedFn, RejectedFn } from '../types/index'

// 拦截器对象类型: use方法的2个函数： xxx.use(function(config){return config}, function(err){ xxx })
interface Interceptor<T> { 
    resolved: ResolvedFn<T>
    rejected?: RejectedFn
}

export default class InterceptorManager<T> {
    // 存储拦截器: use方法的2个函数
    // 删除拦截器： 把数组中元素置为null， 所以需要null类型
    private interceptors: Array<Interceptor<T> | null>
    
    constructor() {
        this.interceptors = []
    }
    
    use(resolved: ResolvedFn<T>, rejected?: RejectedFn): number {
        this.interceptors.push({
            resolved,
            rejected
        })
        return this.interceptors.length -1
    }

    eject(id: number): void {
        if(this.interceptors[id]) {
            //  为什么不将这个元素删除？
            // 执行use：    [x]     返回x索引0
            // 再次执行use: [x,xx]  返回xx索引为1
            // 执行eject,删除x， 结果： [null,xx]
            // 如果直接删除x，数组为[xx]，此时再通过之前返xx返回的索引1 访问xx，就访问不到了
            this.interceptors[id] = null
        }
    }
    
    // 遍历interceptors,将interceptor添加到调用链上
    // fn： interceptor => {  chain.unshift(interceptor) }
    forEach(fn: (Interceptor: Interceptor<T>) => void): void {
        this.interceptors.forEach(interceptor => {
            interceptor && fn(interceptor)
        })
    }


}